package ace.module.weixin.core.impl.service.impl;

import ace.module.weixin.api.enums.WxsMiniAppConfigStatusEnum;
import ace.module.weixin.core.impl.dao.entity.WxsMiniAppConfig;
import ace.module.weixin.core.impl.manager.WxsCacheManager;
import ace.module.weixin.core.impl.manager.WxsLockManager;
import ace.module.weixin.core.impl.manager.WxsMiniAppConfigManager;
import cn.binarywang.wx.miniapp.api.WxMaService;
import cn.binarywang.wx.miniapp.api.impl.WxMaServiceHttpClientImpl;
import java.util.Objects;
import lombok.AllArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import me.chanjar.weixin.common.error.WxRuntimeException;
import org.springframework.stereotype.Component;

/**
 * 从数据库或缓存中读取数据.
 *
 * @author Caspar
 */
@Slf4j
@AllArgsConstructor
@Component
public class DefaultWxMaServiceImpl extends WxMaServiceHttpClientImpl implements WxMaService {

  private final WxsMiniAppConfigManager wxsMiniAppConfigManager;
  private final WxsLockManager wxsLockManager;
  private final WxsCacheManager wxsCacheManager;

  @Override
  public WxMaService switchoverTo(String miniappId) {
    if (this.switchover(miniappId)) {
      return this;
    }
    throw new WxRuntimeException(
        String.format("无法找到对应【%s】的小程序配置信息，请核实！", miniappId));
  }

  @Override
  public boolean switchover(String mpId) {
    WxsMiniAppConfig wxsMiniAppConfig = wxsMiniAppConfigManager.getByAppIdFromDbOrCache(mpId);
    // 不存在或锁定状态
    if (Objects.isNull(wxsMiniAppConfig)
        || !wxsMiniAppConfig.getStatus().equals(WxsMiniAppConfigStatusEnum.NORMAL.getCode())) {
      super.removeConfig(mpId);
      return false;
    }

    if (super.switchover(mpId)) {
      return true;
    }

    DbCacheWxMaConfig config = new DbCacheWxMaConfig(mpId, this.wxsMiniAppConfigManager,
        this.wxsLockManager, this.wxsCacheManager);

    super.addConfig(mpId, config);

    return super.switchover(mpId);
  }
}
